<?php

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of Correios
 *
 * @author link
 */
class Correios {

    //put your code here
    private $ci = null;
    private $dados_entrada = array(
        'nCdEmpresa' => null,
        'sDsSenha' => null,
        'sCepOrigem' => null,
        'CepDestino' => null,
        'nVlPeso' => 0,
        'nCdFormato' => 1,
        'nVlComprimento' => 0,
        'nVlAltura' => 0,
        'nVlLargura' => 0,
        'sCdMaoPropria' => 0,
        'nVlValorDeclarado' => 0,
        'sCdAvisoRecebimento' => 0,
        'nCdServico' => null,
        'nVlDiametro' => 0,
        'StrRetorno' => 'xml'
    );
    private $erro = null;
    private $url = 'http://ws.correios.com.br/calculador/CalcPrecoPrazo.aspx?';

    public function __construct() {
        $this->ci = &get_instance();
        $this->ci->load->library('curl');
    }

    public function set_empresa($empresa) {
        $this->dados_entrada['nCdEmpresa'] = (String) $empresa;
    }

    public function set_senha($senha) {
        $this->dados_entrada['sDsSenha'] = (String) $senha;
    }

    public function set_servico($servico) {
        $this->dados_entrada['nCdServico'] = (String) $servico;
    }

    public function set_cep_origem($cep_origem) {
        $this->dados_entrada['sCepOrigem'] = (String) limpaString(array('entrada' => $cep_origem));
    }

    public function set_cep_destino($cep_destino) {
        $this->dados_entrada['sCepDestino'] = (String) limpaString(array('entrada' => $cep_destino));
    }

    public function set_peso($peso) {
        $this->dados_entrada['nVlPeso'] = (String) $peso;
    }

    public function set_formato($formato) {
        $this->dados_entrada['nCdFormato'] = (Int) $formato;
    }

    public function set_comprimento($comprimento) {
        $this->dados_entrada['nVlComprimento'] = (Float) $comprimento;
    }

    public function set_altura($altura) {
        $this->dados_entrada['nVlAltura '] = (Float) $altura;
    }

    public function set_largura($largura) {
        $this->dados_entrada['nVlLargura'] = (Float) $largura;
    }

    public function set_diametro($diametro) {
        $this->dados_entrada['nVlDiametro'] = (Float) $diametro;
    }

    public function set_mao_propria($mao_propria) {
        $this->dados_entrada['sCdMaoPropria'] = (String) $mao_propria;
    }

    public function set_valor_declarado($valor_declarado) {
        $this->dados_entrada['nVlValorDeclarado'] = (Float) $valor_declarado;
    }

    public function set_aviso_recebimento($aviso_recebimento) {
        $this->dados_entrada['sCdAvisoRecebimento'] = (String) $aviso_recebimento;
    }

    public function valida() {
        if (count($this->dados_entrada) > 0) {
            foreach ($this->dados_entrada as $k => $v) {
                switch ($k) {
                    case 'nCdServico':
                        if (
                                $v != '40010' AND
                                $v != '40045' AND
                                $v != '40126' AND
                                $v != '40215' AND
                                $v != '40290' AND
                                $v != '40096' AND
                                $v != '40436' AND
                                $v != '40444' AND
                                $v != '40568' AND
                                $v != '40606' AND
                                $v != '41106' AND
                                $v != '41068' AND
                                $v != '81019' AND
                                $v != '81027' AND
                                $v != '81035' AND
                                $v != '81868' AND
                                $v != '81833' AND
                                $v != '81850'
                        ) {
                            $this->set_erro('Serviço invalido.');
                        }

                        break;

                    case 'sCepOrigem':
                        if (strlen($v) != '8') {
                            $this->set_erro('CEP origem invalido.');
                        }
                        break;

                    case 'sCepDestino':
                        if ($v == '') {
                            $this->set_erro('CEP destino invalido.');
                        }
                        break;

                    case 'nVlPeso':
                        if ($v == '') {
                            $this->set_erro('Peso invalido.');
                        }
                        break;

                    case 'nCdFormato':
                        if ($v != 1 AND $v != 2 AND $v != 3) {
                            $this->set_erro('Formato invalido.');
                        }

                        break;

                    case 'nVlComprimento':
                        if ($v < 0 OR $v > 105) {
                            $this->set_erro('Comprimento invalido.');
                        }
                        break;

                    case 'nVlAltura ':
                        if ($v < 0 OR $v > 105) {
                            $this->set_erro('Altura invalido.');
                        }
                        break;

                    case 'nVlDiametro':
                        if ($v < 0 OR $v > 105) {
                            $this->set_erro('Diâmetro invalido.');
                        }
                        break;

                    case 'nVlValorDeclarado':
                        if (!is_float($v)) {
                            $this->set_erro('Valor declarado invalido.');
                        }
                        break;

                    case 'sCdAvisoRecebimento':
                        if ($v !== 'S' AND $v !== 'N') {
                            $this->set_erro('Aviso de recebimento invalido.');
                        }
                        break;

                    default:
                        break;
                }
            }
        } else {
            $this->set_erro('Não foi definido nenhum valor de entrada.');
        }
    }

    private function set_erro($erro) {
        $this->erro[] = $erro;
    }

    public function get_erro($separador = "\n") {
        return implode($separador, $this->erro);
    }

    public function enviar() {
        $url = '';
        foreach ($this->dados_entrada as $k => $v) {
            if ($url != '') {
                $url .= '&';
            }
            $url .= $k . '=' . ($v == null ? '' : $v);
        }
        $_retorno = $this->ci->curl->simple_get($this->url . $url);
        return $this->object2array(simplexml_load_string($_retorno));
    }

    public function debug() {
        $this->ci->curl->debug();
    }

    function object2array($object) {
        return @json_decode(@json_encode($object), 1);
    }

}